package pe.com.bbva.modpre.persistencia.hibernate;

import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import pe.com.bbva.modpre.dominio.Integrante;
import pe.com.bbva.modpre.dominio.Usuario;
import pe.com.bbva.modpre.persistencia.IntegranteDAO;
import pe.com.bbva.modpre.utileria.Busqueda;

@Repository
@SuppressWarnings("serial")
public class IntegranteHibernate extends BaseHibernate<Integrante, Long> 
implements IntegranteDAO {

	@Value("${jdbc.schema}")
	private String schema;

	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	public String obtenerObjetoBBDD(String objetoBBDD) {
		return schema+"."+objetoBBDD;
	}
	@Autowired
	public IntegranteHibernate(SessionFactory sessionFactory) {
		setSessionFactory(sessionFactory);
	}

	@Override
	@SuppressWarnings("deprecation")
	public List<Integrante> busquedaIntegrantes(Integrante integrante) {
		Busqueda filtro = Busqueda.forClass(Integrante.class);
		if(integrante!=null){
			if(integrante.getId()!=null){
				filtro.add(Restrictions.eq("id",
						integrante.getId()));
			}
			if(integrante.getUsuario()!=null){
				Busqueda filtroUsuario = filtro.createCriteria("usuario");
				filtroUsuario.add(Restrictions.sqlRestriction("lower({alias}.nombres||' '||{alias}.paterno||' '||{alias}.materno) like lower(?)", "%"+integrante.getUsuario().getNombres().trim()+"%",Hibernate.STRING));
			}
			if(integrante.getSuperior()!=null){
				if(integrante.getSuperior().getId()==null){
					Busqueda filtroSuperior = filtro.createCriteria("superior");
					filtroSuperior.add(Restrictions.sqlRestriction("lower({alias}.nombres||' '||{alias}.paterno||' '||{alias}.materno) like lower(?)", "%"+integrante.getSuperior().getNombres().trim()+"%",Hibernate.STRING));
				}else{
					filtro.createAlias("superior", "s");
					filtro.add(Restrictions.eq("s.id",
							integrante.getSuperior().getId()));
				}
			}
			if(integrante.getEstado()!=null){
				filtro.createAlias("estado", "e");
				filtro.add(Restrictions.ilike("e.nombre",
						integrante.getEstado().getNombre(), MatchMode.ANYWHERE));
			}
			if(integrante.getModificado()!=null){
				filtro.add(Restrictions.eq("modificado",
						integrante.getModificado()));
			}
			if(integrante.getEquipo()!=null){
				if(integrante.getEquipo().getId()!=null){
					filtro.createAlias("equipo", "equ");
					filtro.add(Restrictions.eq("equ.id",
							integrante.getEquipo().getId()));
				}
			}
		}
		filtro.addOrder(Order.asc("id"));
		return buscar(filtro);
	}

	@Override
	public Integrante obtenerIntegrantexUsuario(Usuario usuario) {
		return obtenerHql("select i from Integrante i where usuario.id=?", usuario.getId());
	}

	@Override
	public List<Integrante> integrantesxEquipo(String codigo) {
		// TODO Auto-generated method stub
		return buscarHql("select i from Integrante i where equipo.codigo=?", codigo);
	}

	@Override
	public List<Integrante> integrantesxEquipoPadre(Usuario usuarioPadre) {
		/*StringBuilder sql=new StringBuilder();
		sql.append("select * from "+obtenerObjetoBBDD("org_integrante i ")+
					"left join "+ obtenerObjetoBBDD("seg_usuario u ") + "on i.superior=u.id"+ 
					"inner join "+ obtenerObjetoBBDD("rg_equipo e ") + " on i.equipo=e.id "+
					"inner join "+obtenerObjetoBBDD("org_equipo ep ")+" on e.padre=ep.id "+
					"inner join "+obtenerObjetoBBDD("seg_usuario us ")+" on i.usuario=us.id"+
					"where ep.codigo='?' and (u.registro='?' or superior is null)");
		
		List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql.toString(), usuarioPadre.getEquipo().getCodigo(),usuarioPadre.getRegistro());
		List<Integrante> listaD = new ArrayList<Integrante>();
		for (Map<String, Object> map : rows) {
			Integrante integrante = new Integrante();
			Usuario usuario = new Usuario();
			usuario.setPaterno((String) map.get("PATERNO"));
			usuario.setMaterno((String) map.get("MATERNO"));
			usuario.setNombres((String) map.get("NOMBRES"));
			usuario.setId(Long.parseLong(map.get("ID_USUARIO").toString()));
			
			integrante.setId(Long.parseLong(map.get("ID").toString()));
			integrante.setUsuario(usuario);
			
		listaD.add(integrante);
		}*/
		//buscarHql("select i from Integrante i left join Usuario u on i.superior=u.id inner join Equipo e on i.equipo=e.id inner join Equipo ep on e.padre=ep.id where ep.codigo='?' and (u.registro='?' or superior.id is null) ", usuarioPadre.getEquipo().getCodigo(),usuarioPadre.getRegistro());
		List<Integrante> listaD = buscarHql("select i from Integrante i left join i.superior s where i.equipo.padre.codigo=? and (s.registro=? or i.superior is null)",
				usuarioPadre.getEquipo().getCodigo(),usuarioPadre.getRegistro());
		return listaD;
	}
}
